#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *args[]) {


	/*
		Dichiarare tutte le variabili che ritenete necessarie,
		tra cui due variabili per la gestione dei file e un
		puntatore a intero per l'allocazione dinamica di un
		vettore di interi. Il puntatore servira' per contenere
		l'indirizzo del primo elemento del vettore.
		Ricordare inoltre che la variabile che conterra'
		la media deve essere di tipo reale.
	*/
	FILE *sf, *df;
	char* filename;
	int* v;
	int i, n;
	double mean;

	
	/*
	Controllare che l'utente lanci il programma
	correttamente.
	Lo Usage deve essere: 
	Usage: leggi_file_malloc.x <source file> <destination file>
	Usare argc per capire se il numero di parametri e' corretto.
	Se l'utente non lancia l'esecuzione correttamente
	il programma deve terminare.
	*/
	if(argc != 3){
		printf("Usage: ./leggi_file_malloc.x <source file> <destination file>\n");
		return 1;
	}
	
	
		/*
			Invitare l'utente a digitare il numero di elementi contenuti nel
			file che deve essere letto.
			Memorizzare tale numero in una variabile.
		*/
	printf("Inserire il numeri di elementi da leggere dal file: ");
	scanf("%d", &n);
		/*
			Allocare dinamicamente la memoria per la memorizzazione di un
			vettore di interi di dimensione pari al numero indicato precedentemente
			dall'utente. Utilizzare la funzione mallo.
		*/
	v = (int *) malloc(sizeof(int) * n);
	
		/*
			Aprire in lettura il file che contiene i numeri da leggere.
			Controllare che la fopen non ritorni il valore NULL, in ta
			caso l'apertura del file non e' andata a buon fine e
			l'utente deve essere informato.
		*/
	sf = fopen(args[1], "r");
	if(!sf){
		printf("Impossibile aprire il file %s\n", args[1]);
		return 1;
	}
			
			/*
				Leggere i numeri contenuti nel file e memorizzarli
				nel vettore precedentemente creato
			*/
	for(i = 0; i < n; ++i)
		fscanf(sf, "%d\n", &v[i]);
			
			
			/*
				Chiudere il file
			*/
	fclose(sf);
			
			/*
				Calcolare la media dei valori contenuti nel vettore
			*/
	for(i = 0; i < n; ++i){
		mean += i;
	}
	mean /= n;

			/* Aprire il file destinazione in scrittura */
			
	df = fopen(args[2], "w");
			
			/*
				Scrivere nel file gli elementi del vettore uno per riga
				e aggiungere alla fine il valore della media.
			*/
	for(i = 0; i < n; ++i)
		fprintf(df, "%d\n", v[i]);
	fprintf(df, "%f\n", mean);
			
			/*
				Liberare la memoria allocata per il vettore con la funzione free.
			*/
	free(v);
			
			
			/* Chiudere il file destinazione */
	fclose(df);

	
			/*
				Informare l'utente che tutto e' andato a buon fine e che 
				il risultato si trova nel file indicato nella linea di comando
			*/
	printf("Operazione andata a buon fine. Il risultato si trova nel file %s\n", args[2]);
}
